﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using TestesFixacao.Dominio.Modelos;
using TestesFixacao.Dominio.Repositorios;
using TestesFixacao.Dominio.Repositorios.ADO;
using TestesFixacao.WindowsApp.Refatorado.Controls.Shared;

namespace TestesFixacao.WindowsApp.Refatorado.Controls.TesteForms
{
    public partial class TesteDialog : BaseDialog
    {
        private IRepositorioMateria _repositorioMateria;
        private IRepositorioQuestao _repositorioQuestao;

        private Teste _teste;
        private List<Questao> _questoes = new List<Questao>();

        public TesteDialog(List<Disciplina> disciplinas, string descricao)
        {
            InitializeComponent();

            _repositorioMateria = new RepositorioAdoMateria();
            _repositorioQuestao = new RepositorioAdoQuestao();

            if (disciplinas == null)
                throw new ArgumentNullException("disciplinas", "Disciplinas não pode ser nulo.");

            if (disciplinas.Count == 0)
                throw new ArgumentOutOfRangeException("disciplinas", "0", "Deverá ter no mínimo uma questao.");

            if (string.IsNullOrEmpty(descricao))
                throw new ArgumentNullException("descricao");

            base.DescricaoTela = descricao;

            base.RedimensionaJanela(new Size(Size.Width, Size.Height));

            base.RegistraControles(txtDataGeracao, txtNumero);

            cmbDisciplina.Items.OverrideAll(disciplinas);
        }

        public Teste Teste
        {
            get { return _teste; }
            set
            {
                _configurando = true;
                _teste = value;

                txtNumero.Text = _teste.Numero.ToString();
                txtDataGeracao.Text = _teste.DataGeracao.ToString();
                cmbDisciplina.SelectedItem = _teste.Disciplina;
                cmbDisciplina.Select();

                if (_teste.Questoes != null)
                {
                    spinNumeroQuestoes.Value = _teste.Questoes.Count;
                    lsbQuestoes.Items.OverrideAll(_teste.Questoes);
                    cmbMateria.SelectedItem = _teste.Questoes[0].Materia;
                }

                _configurando = false;

                DoOperation();
            }
        }

        protected override void DoOperation()
        {
            if (_configurando)
                return;

            _teste.Numero = int.Parse(txtNumero.Text);
            _teste.DataGeracao = Convert.ToDateTime(txtDataGeracao.Text);
            _teste.Disciplina = cmbDisciplina.SelectedItem as Disciplina;

            try
            {
                _teste.Valida();

                Main.Instance.ShowMessageInFooter("O Teste já pode ser gravado");

                HabilitaBotaoOk();
            }
            catch (Exception ex)
            {
                DesabilitaBotaoOk();
                Main.Instance.ShowMessageInFooter(ex.Message);
            }
        }

        private void cmbDisciplina_SelectedIndexChanged(object sender, EventArgs e)
        {
            Disciplina disciplinaSelecionada = cmbDisciplina.SelectedItem as Disciplina;
            List<Materia> materiasDisciplina = _repositorioMateria.SelecionaTodosPorDisciplina(disciplinaSelecionada);

            cmbMateria.Items.OverrideAll(materiasDisciplina);
        }

        private void cmbMateria_SelectedIndexChanged(object sender, EventArgs e)
        {
            Materia materia = cmbMateria.SelectedItem as Materia;

            _questoes = _repositorioQuestao.SelecionaTodosPorMateria(materia);

            DoOperation();

            _teste.Disciplina.Questoes = _questoes;
        }

        private void btnGerarTeste_Click(object sender, EventArgs e)
        {
            txtDataGeracao.Text = DateTime.Now.ToString();
            _teste.GerarTeste(Convert.ToInt32(spinNumeroQuestoes.Value));
            lsbQuestoes.Items.OverrideAll(_teste.Questoes);
        }
    }
}